package com.zhongjianjian.redis.guandao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: LCG
 * 作者: LCG
 * 日期: 2021/3/3  13:30
 * 描述: 测试redis的管道
 */
@Component
public class GuanDaoTest {

    @Autowired
    private RedisTemplate redisTemplate;


    public void guanDao(){

        Long start=System.currentTimeMillis();

        redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {

                redisConnection.openPipeline();

               /// Map<byte[],byte[]> map=new HashMap<>();

                for(int i=0;i<10000;i++){
                    //map.put(("key"+i).getBytes(),("key"+i).getBytes());
                    redisConnection.set(("key"+i).getBytes(),("key"+i).getBytes());
                }


                redisConnection.closePipeline();
                return null;
            }
        });

        Long end=System.currentTimeMillis();

        System.out.println(end-start);
    }


    /**
     * 作者: LCG
     * 日期: 2021/3/3  13:43
     * 描述: 对比for操作
     * @Param []
     * @Return void
     */
    public void testForInsert(){
        Long start=System.currentTimeMillis();
        for(int i=0;i<10000;i++){
           redisTemplate.opsForValue().set("key"+i,"key"+i);
        }

        Long end=System.currentTimeMillis();

        System.out.println(end-start);
    }


    /**
     * 作者: LCG
     * 日期: 2021/3/3  13:47
     * 描述: 对比使用 multiSet操作    mutiSet >  Pipeline  > for
     * @Param []
     * @Return void
     */
    public void testMultiSet(){

        Long start=System.currentTimeMillis();

        Map<String,Object> map=new HashMap<>();

        for(int i=0;i<100000;i++){
           map.put("key"+i,"key"+i);
        }

        redisTemplate.opsForValue().multiSet(map);

        Long end=System.currentTimeMillis();
        System.out.println(end-start);

    }



    /**
     * 作者: LCG
     * 日期: 2021/3/3  13:58
     * 描述: 测试内存优化  hash  VS  k-v   相同数据量 使用Hash存储要比直接使用 k-v 更节省内存
     * @Param []
     * @Return void
     */
    public void testHash(){

        Long start=System.currentTimeMillis();

        Map<String,Object> map=new HashMap<>();

        for(int i=0;i<100000;i++){
            map.put("key"+i,"key"+i);
        }

        redisTemplate.opsForHash().putAll("keymap",map);

        Long end=System.currentTimeMillis();
        System.out.println(end-start);

    }

}
